import logging
import sys
from typing import Any, Dict, Optional

from .config import settings

# 日志格式
LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
# 日志日期格式
LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S"

def get_logger(name: str = "dify-api") -> logging.Logger:
    """
    获取配置好的日志记录器
    
    Args:
        name: 日志记录器名称
        
    Returns:
        配置好的日志记录器实例
    """
    # 获取日志级别
    log_level = getattr(logging, settings.LOG_LEVEL.upper(), logging.INFO)
    
    # 创建日志记录器
    logger = logging.getLogger(name)
    logger.setLevel(log_level)
    
    # 检查是否已经配置了处理器，避免重复添加
    if not logger.handlers:
        # 控制台处理器
        console_handler = logging.StreamHandler(sys.stdout)
        console_handler.setFormatter(
            logging.Formatter(LOG_FORMAT, datefmt=LOG_DATE_FORMAT)
        )
        logger.addHandler(console_handler)
    
    return logger

# 创建主日志记录器
logger = get_logger()

def log_request(method: str, url: str, data: Optional[Dict[str, Any]] = None) -> None:
    """
    记录HTTP请求日志
    
    Args:
        method: HTTP方法
        url: 请求URL
        data: 请求数据（如果有）
    """
    logger.debug(f"Request: {method} {url}")
    if data and settings.DEBUG:
        # 在调试模式下记录请求数据，但排除敏感信息
        safe_data = data.copy() if data else {}
        if "api_key" in safe_data:
            safe_data["api_key"] = "***"
        logger.debug(f"Request Data: {safe_data}")

def log_response(status_code: int, response_data: Any, url: str) -> None:
    """
    记录HTTP响应日志
    
    Args:
        status_code: 响应状态码
        response_data: 响应数据
        url: 请求URL
    """
    logger.debug(f"Response: {status_code} from {url}")
    if settings.DEBUG:
        # 在调试模式下记录响应数据（可能很长，只记录部分）
        response_str = str(response_data)
        if len(response_str) > 1000:
            response_str = f"{response_str[:1000]}... (truncated)"
        logger.debug(f"Response Data: {response_str}")

def log_error(error: Exception, context: Optional[str] = None) -> None:
    """
    记录错误日志
    
    Args:
        error: 异常对象
        context: 错误上下文信息
    """
    if context:
        logger.error(f"Error in {context}: {str(error)}", exc_info=True)
    else:
        logger.error(f"Error: {str(error)}", exc_info=True)
